﻿using SQ.BLL.Interfaces;
using SQ.Domain;
using SQ.Infrastructure.DataContexts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SQ.BLL.Implementation
{
    public class EstabelecimentoBS : IEstabelecimentoBS
    {
        private SmartQueueDataContext data = new SmartQueueDataContext();

        public void CriarEstabelecimento(Estabelecimento estabelecimento)
        {
            if (estabelecimento.IsValid())
            {
                try
                {
                    data.Estabelecimentos.Add(estabelecimento);
                    data.SaveChanges();
                }
                catch (Exception ex)
                {
                    throw new Exception(string.Format("Erro ao criar um novo usuario, motivo: {0}", ex.Message));
                }

            }
            else
            {
                throw new Exception("Usuário Inválido");
            }
        }

        public void AlterarEstabelecimento(Estabelecimento estabelecimento)
        {
            if (estabelecimento.IsValid())
            {
                try
                {
                    estabelecimento.EnderecoId = estabelecimento.Endereco.Id;

                    this.data.Entry(estabelecimento).State = System.Data.Entity.EntityState.Modified;
                    this.data.Entry(estabelecimento.Endereco).State = System.Data.Entity.EntityState.Modified;
                    this.data.SaveChanges();
                }
                catch (Exception ex)
                {
                    throw new Exception(string.Format("Erro ao Alterar estabelecimento, motivo: {0}", ex.Message));
                }
            }
            else
            {
                throw new Exception("Estabelecimento Inválido");
            }
        }

        public void ExcluirEstabelecimento(int codigoEstabelecimento)
        {
            if (codigoEstabelecimento != 0)
            {
                try
                {
                    var estab = this.data.Estabelecimentos.FirstOrDefault(p => p.Id == codigoEstabelecimento);
                    data.Set<Estabelecimento>().Remove(estab);
                    this.data.SaveChanges();
                }
                catch (Exception ex)
                {
                    throw new Exception(string.Format("Erro ao excluir estabelecimento, motivo: {0}", ex.Message));
                }
            }
            else
            {
                throw new Exception("Estabelecimento Inválido");
            }
        }

        public ICollection<Estabelecimento> ObterEstabelecimentos()
        {
            try
            {
                return this.data.Estabelecimentos.ToList();
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("Erro ao obter estabelecimento, motivo: {0}", ex.Message));
            }
        }

        public Estabelecimento ObterEstabelecimentoPorEmail(string email)
        {
            try
            {
                if (string.IsNullOrEmpty(email))
                {
                    throw new ArgumentException("Email inválido");
                }

                return this.data.Estabelecimentos.FirstOrDefault(p => p.Email.Contains(email));
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("Erro ao obter estabelecimento, motivo: {0}", ex.Message));
            }

        }


        public Estabelecimento ObterEstabelecimentoPorId(int idEstabelecimento)
        {
            try
            {
                if (idEstabelecimento == 0)
                {
                    throw new ArgumentException("Estabelecimento Inválido");
                }

                return this.data.Estabelecimentos.FirstOrDefault(p => p.Id.Equals(idEstabelecimento));
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("Erro ao obter estabelecimento, motivo: {0}", ex.Message));
            }
        }
    }
}
